// Keywords: migration, dispersal, CRISPR gene drive

initialize() {
	initializeMutationRate(1e-7);
	initializeMutationType("m1", 0.5, "f", 0.0);   // neutral
	initializeMutationType("m2", 0.5, "f", -0.1);  // MCR complex
	initializeGenomicElementType("g1", m1, 1.0);
	initializeGenomicElement(g1, 0, 99999);
	initializeRecombinationRate(1e-8);
}
1 early() {
	for (i in 0:5)
		sim.addSubpop(i, 500);
	for (i in 1:5)
		sim.subpopulations[i].setMigrationRates(i-1, 0.001);
	for (i in 0:4)
		sim.subpopulations[i].setMigrationRates(i+1, 0.1);
}
100 late() {
	p0.haplosomes[0:49].addNewDrawnMutation(m2, 10000);
}
100:10000 late() {
	if (sim.countOfMutationsOfType(m2) == 0)
	{
		fixed = any(sim.substitutions.mutationType == m2);
		cat(ifelse(fixed, "FIXED\n", "LOST\n"));
		sim.simulationFinished();
	}
}
mutationEffect(m2) {
	return 1.5 - subpop.id * 0.15;
}
100:10000 modifyChild() {
	mut = sim.mutationsOfType(m2);
	if (size(mut) == 1)
	{
		hasMutOnChromosome1 = child.haploidGenome1.containsMutations(mut);
		hasMutOnChromosome2 = child.haploidGenome2.containsMutations(mut);
		if (hasMutOnChromosome1 & !hasMutOnChromosome2)
			child.haploidGenome2.addMutations(mut);
		else if (hasMutOnChromosome2 & !hasMutOnChromosome1)
			child.haploidGenome1.addMutations(mut);
	}
	return T;
}
